package Conexion;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.InputStream;
import gnu.io.CommPortIdentifier; 
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent; 
import gnu.io.SerialPortEventListener; 
import java.util.Enumeration;
import java.util.logging.Level;
import java.util.logging.Logger;


public class ComunicacionArduino implements SerialPortEventListener{
	
	private boolean Conectado=false;
	private SerialPort serialPort;
	
	/**
	* A BufferedReader which will be fed by a InputStreamReader 
	* converting the bytes into characters 
	* making the displayed results codepage independent
	*/
	private BufferedReader input;
	/** The output stream to the port */
	private OutputStream output;
	/** Milliseconds to block while waiting for port open */
	private static final int TIME_OUT = 2000;
	/** Default bits per second for COM port. */
	private static final int DATA_RATE = 9600;
	/** The port we're normally going to use. */
	
	/*private static final String PORT_NAMES[] = 
	{ 
			//"/dev/tty.usbserial-A9007UX1", // Mac OS X
			//"/dev/ttyUSB0", // Linux
			"COM7", // Windows
	};
	*/

	private String PORT_NAMES;
	
	public ComunicacionArduino(String _Puerto)
	{
		PORT_NAMES=_Puerto;
	}
		
	public SerialPort puerto()
	{
		return serialPort;
	}
   
	
	public void initialize() 
	{
		CommPortIdentifier portId = null;
		Enumeration<?> portEnum = CommPortIdentifier.getPortIdentifiers();

		
		//First, Find an instance of serial port as set in PORT_NAMES.
		while (portEnum.hasMoreElements()) 
		{
			CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();
			String portName = PORT_NAMES;
			
				if (currPortId.getName().equals(portName)) 
				{
					portId = currPortId;
					break;
				}
			
		}
		
		
		if (portId == null) 
		{
			Conectado = false;
			System.out.println("Could not find COM port.");
			System.out.println(PORT_NAMES);
			return;
		}

		try 
		{
			// open serial port, and use class name for the appName.
			serialPort = (SerialPort) portId.open(this.getClass().getName(),
					TIME_OUT);

			// set port parameters
			serialPort.setSerialPortParams(DATA_RATE,
					SerialPort.DATABITS_8,
					SerialPort.STOPBITS_1,
					SerialPort.PARITY_NONE);

			// open the streams
			input = new BufferedReader(new InputStreamReader(serialPort.getInputStream()));
			output = serialPort.getOutputStream();

			// add event listeners
			serialPort.addEventListener(this);
			//serialPort.notifyOnDataAvailable(true);
			Conectado = true;
		} 
		catch (Exception e) 
		{
			System.err.println(e.toString());
		}
	}

	/**
	 * This should be called when you stop using the port.
	 * This will prevent port locking on platforms like Linux.
	 */
	public synchronized void close() 
	{
		if (serialPort != null) 
		{
			serialPort.removeEventListener();
			serialPort.close();
		}
	}
	
	public synchronized boolean conectado()
	{
		if(Conectado){
			return true;
		}
		else
		{
			return false;
		}
	}

	/**
	 * Handle an event on the serial port. Read the data and print it.
	 */
	public synchronized void serialEvent(SerialPortEvent oEvent) 
	{
		if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) 				
		{
			try 
			{
				String inputLine=input.readLine();
				System.out.println(inputLine);
			} 
			catch (Exception e) 
			{
				System.err.println(e.toString());
			}
		}
		// Ignore all the other eventTypes, but you should consider the other ones.
	}
	
	public synchronized String serialEvent2(SerialPortEvent oEvent) 
	{
		if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) 				
		{
			try 
			{
				String inputLine=input.readLine();
				System.out.println(inputLine);
				return inputLine;
			} 
			catch (Exception e) 
			{
				//System.err.println(e.toString());
			}
		}
		return "";
		// Ignore all the other eventTypes, but you should consider the other ones.
	}
	
	public synchronized void sendMessage(String cadena)
	{
		byte[] asd;
		asd = cadena.getBytes();
		try
		{
			output.write(asd);
		}
		catch(IOException ex)
		{
			Logger.getLogger(ComunicacionArduino.class.getName()).log(Level.SEVERE, null, ex);
		}
	}


	
}